{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Simple example of TuRBO-1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from turbo import Turbo1\n",
    "import numpy as np\n",
    "import torch\n",
    "import math\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Set up an optimization problem class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Levy:\n",
    "    def __init__(self, dim=10):\n",
    "        self.dim = dim\n",
    "        self.lb = -5 * np.ones(dim)\n",
    "        self.ub = 10 * np.ones(dim)\n",
    "        \n",
    "    def __call__(self, x):\n",
    "        assert len(x) == self.dim\n",
    "        assert x.ndim == 1\n",
    "        assert np.all(x <= self.ub) and np.all(x >= self.lb)\n",
    "        w = 1 + (x - 1.0) / 4.0\n",
    "        val = np.sin(np.pi * w[0]) ** 2 + \\\n",
    "            np.sum((w[1:self.dim - 1] - 1) ** 2 * (1 + 10 * np.sin(np.pi * w[1:self.dim - 1] + 1) ** 2)) + \\\n",
    "            (w[self.dim - 1] - 1) ** 2 * (1 + np.sin(2 * np.pi * w[self.dim - 1])**2)\n",
    "        return val\n",
    "\n",
    "f = Levy(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create a Turbo optimizer instance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using dtype = torch.float64 \n",
      "Using device = cpu\n"
     ]
    }
   ],
   "source": [
    "turbo1 = Turbo1(\n",
    "    f=f,  # Handle to objective function\n",
    "    lb=f.lb,  # Numpy array specifying lower bounds\n",
    "    ub=f.ub,  # Numpy array specifying upper bounds\n",
    "    n_init=20,  # Number of initial bounds from an Latin hypercube design\n",
    "    max_evals = 1000,  # Maximum number of evaluations\n",
    "    batch_size=10,  # How large batch size TuRBO uses\n",
    "    verbose=True,  # Print information from each batch\n",
    "    use_ard=True,  # Set to true if you want to use ARD for the GP kernel\n",
    "    max_cholesky_size=2000,  # When we switch from Cholesky to Lanczos\n",
    "    n_training_steps=50,  # Number of steps of ADAM to learn the hypers\n",
    "    min_cuda=1024,  # Run on the CPU for small datasets\n",
    "    device=\"cpu\",  # \"cpu\" or \"cuda\"\n",
    "    dtype=\"float64\",  # float64 or float32\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Run the optimization process"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting from fbest = 20.98\n",
      "50) New best: 15.65\n",
      "80) New best: 11.27\n",
      "90) New best: 9.325\n",
      "100) New best: 8.288\n",
      "110) New best: 6.944\n",
      "120) New best: 5.974\n",
      "140) New best: 5.951\n",
      "160) New best: 5.905\n",
      "170) New best: 5.905\n",
      "180) New best: 5.822\n",
      "190) New best: 5.785\n",
      "200) New best: 5.759\n",
      "220) New best: 5.738\n",
      "230) New best: 5.683\n",
      "240) Restarting with fbest = 5.683\n",
      "Starting from fbest = 32.5\n",
      "320) New best: 5.526\n",
      "330) New best: 3.95\n",
      "350) New best: 1.736\n",
      "370) New best: 1.229\n",
      "410) New best: 1.206\n",
      "420) New best: 1.193\n",
      "430) New best: 1.191\n",
      "440) New best: 1.163\n",
      "450) New best: 1.145\n",
      "460) New best: 1.06\n",
      "480) New best: 1.024\n",
      "490) New best: 1.01\n",
      "500) New best: 1.001\n",
      "530) Restarting with fbest = 1.001\n",
      "Starting from fbest = 12.85\n",
      "730) Restarting with fbest = 8.634\n",
      "Starting from fbest = 9.62\n",
      "890) Restarting with fbest = 5.87\n",
      "Starting from fbest = 25.71\n"
     ]
    }
   ],
   "source": [
    "turbo1.optimize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Extract all evaluations from Turbo and print the best"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best value found:\n",
      "\tf(x) = 1.001\n",
      "Observed at:\n",
      "\tx = [-3.006  0.914  3.659  0.853  0.033 -0.203  1.199  0.812 -0.301  2.42 ]\n"
     ]
    }
   ],
   "source": [
    "X = turbo1.X  # Evaluated points\n",
    "fX = turbo1.fX  # Observed values\n",
    "ind_best = np.argmin(fX)\n",
    "f_best, x_best = fX[ind_best], X[ind_best, :]\n",
    "\n",
    "print(\"Best value found:\\n\\tf(x) = %.3f\\nObserved at:\\n\\tx = %s\" % (f_best, np.around(x_best, 3)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot the progress\n",
    "Each trust region is independent and finds different solutions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(7, 5))\n",
    "matplotlib.rcParams.update({'font.size': 16})\n",
    "plt.plot(fX, 'b.', ms=10)  # Plot all evaluated points as blue dots\n",
    "plt.plot(np.minimum.accumulate(fX), 'r', lw=3)  # Plot cumulative minimum as a red line\n",
    "plt.xlim([0, len(fX)])\n",
    "plt.ylim([0, 30])\n",
    "plt.title(\"10D Levy function\")\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
